/**
 * 格式化时间
 * @param time 时间戳或日期字符串
 * @param format 格式化模板，默认 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的时间字符串
 */
export const formatTime = (time: string | number | Date, format: string = 'YYYY-MM-DD HH:mm:ss'): string => {
    if (!time) return ''
    
    const date = new Date(time)
    if (isNaN(date.getTime())) return ''

    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()
    const hours = date.getHours()
    const minutes = date.getMinutes()
    const seconds = date.getSeconds()

    const formatMap: { [key: string]: number } = {
        'YYYY': year,
        'MM': month,
        'DD': day,
        'HH': hours,
        'mm': minutes,
        'ss': seconds
    }

    return format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, (match) => {
        const value = formatMap[match]
        return value < 10 ? `0${value}` : `${value}`
    })
}

/**
 * 相对时间
 * @param time 时间戳或日期字符串
 * @returns 相对时间字符串，如：刚刚、5分钟前、2小时前、3天前等
 */
export const relativeTime = (time: string | number | Date): string => {
    if (!time) return ''
    
    const date = new Date(time)
    if (isNaN(date.getTime())) return ''

    const now = new Date().getTime()
    const diff = now - date.getTime()
    
    // 转换为秒
    const seconds = Math.floor(diff / 1000)
    
    // 小于1分钟
    if (seconds < 60) {
        return '刚刚'
    }
    
    // 小于1小时
    const minutes = Math.floor(seconds / 60)
    if (minutes < 60) {
        return `${minutes}分钟前`
    }
    
    // 小于1天
    const hours = Math.floor(minutes / 60)
    if (hours < 24) {
        return `${hours}小时前`
    }
    
    // 小于30天
    const days = Math.floor(hours / 24)
    if (days < 30) {
        return `${days}天前`
    }
    
    // 小于12个月
    const months = Math.floor(days / 30)
    if (months < 12) {
        return `${months}个月前`
    }
    
    // 大于等于12个月
    const years = Math.floor(months / 12)
    return `${years}年前`
}

/**
 * 格式化日期范围
 * @param start 开始时间
 * @param end 结束时间
 * @param format 格式化模板
 * @returns 格式化后的时间范围字符串
 */
export const formatDateRange = (
    start: string | number | Date,
    end: string | number | Date,
    format: string = 'YYYY-MM-DD'
): string => {
    return `${formatTime(start, format)} 至 ${formatTime(end, format)}`
}

/**
 * 获取指定日期的开始时间
 * @param date 日期
 * @returns Date对象，时间设置为00:00:00
 */
export const getStartOfDay = (date: Date = new Date()): Date => {
    const newDate = new Date(date)
    newDate.setHours(0, 0, 0, 0)
    return newDate
}

/**
 * 获取指定日期的结束时间
 * @param date 日期
 * @returns Date对象，时间设置为23:59:59
 */
export const getEndOfDay = (date: Date = new Date()): Date => {
    const newDate = new Date(date)
    newDate.setHours(23, 59, 59, 999)
    return newDate
}